package com.demomaster.quickcompat.util

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.PixelFormat
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.net.Uri
import java.io.IOException

class BitmapUtil {
    companion object {

        @JvmStatic
        fun cropBitmap(
            bitmap: Bitmap?,
            x: Int,
            y: Int,
            tartgetWidth: Int,
            tartgetHeight: Int
        ): Bitmap {
            return Bitmap.createBitmap(bitmap!!, x, y, tartgetWidth, tartgetHeight, null, false)
        }

        @JvmStatic
        fun convertDrawableResourceToBitmap(drawable: Drawable): Bitmap? {
            return if (drawable is BitmapDrawable) {
                 drawable.bitmap;
            } else {
                //if (drawable is NinePatchDrawable)
                getBitmapFormDrawable(drawable)
            }
        }

        @JvmStatic
        fun getBitmapFormDrawable(drawable: Drawable): Bitmap {
            val bitmap = Bitmap.createBitmap(
                drawable.intrinsicWidth,
                drawable.intrinsicHeight,
                if (drawable.opacity != PixelFormat.OPAQUE)
                    Bitmap.Config.ARGB_8888 else Bitmap.Config.RGB_565
            )
            val canvas = Canvas(bitmap)
            drawable.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
            //设置绘画的边界，此处表示完整绘制
            drawable.draw(canvas)
            return bitmap
        }

        /**
         * 通过Uir获取bitmap
         *
         * @param uri
         * @param mContext
         * @return
         */
        @JvmStatic
        fun getBitmapFromUri(uri: Uri, mContext: Context): Bitmap? {
//            try {
//                // 读取uri所在的图片
//                val bitmap = MediaStore.Images.Media.getBitmap(mContext.contentResolver, uri)
//                return bitmap
//            } catch (e: Exception) {
//                e.printStackTrace()
//                return null
//            }

            return try {
                mContext.contentResolver.openInputStream(uri).use { inputStream ->
                    BitmapFactory.decodeStream(inputStream)
                }
            } catch (e: IOException) {
                e.printStackTrace()
                null
            }
        }

        data class ImageProcessingParams(
            var scaleRatio: Float = 1.0f,
            var compressQuality: Int = 100,
            var targetWidth: Int? = null,
            var targetHeight: Int? = null
        )
        /* 根据给定的参数调整位图大小。
        *
        * @param srcBitmap 源位图。
        * @param params 图像处理参数，包含缩放比例、压缩质量、目标宽度和高度等。
        * @return 调整大小后的位图或原始位图（如果不需要调整）。
        */
        @JvmStatic
        fun resizeBitmapWithParams(srcBitmap: Bitmap, params: ImageProcessingParams): Bitmap? {
            val width = srcBitmap.width.toFloat()
            val height = srcBitmap.height.toFloat()

            // 计算宽高缩放率
            var scaleX = params.scaleRatio
            var scaleY = params.scaleRatio

            // 如果提供了具体的目标宽度或高度，则优先使用它们进行缩放
            params.targetWidth?.let { targetWidth ->
                if (targetWidth > 0) {
                    scaleX = targetWidth / width
                }
            }

            params.targetHeight?.let { targetHeight ->
                if (targetHeight > 0) {
                    scaleY = targetHeight / height
                }
            }

            // 如果没有提供目标尺寸，则保持原图大小
            if (scaleX == 1f && scaleY == 1f) {
                return srcBitmap // 不需要缩放，直接返回原图
            }

            // 创建操作图片用的matrix对象
            val matrix = Matrix()
            // 缩放图片动作
            matrix.postScale(scaleX, scaleY)

            // 创建新的位图
            return try {
                Bitmap.createBitmap(srcBitmap, 0, 0, srcBitmap.width, srcBitmap.height, matrix, true)
            } catch (e: Exception) {
                e.printStackTrace()
                null // 如果创建位图失败，返回null
            }
        }

        /**
         * 合并两个Bitmap。
         *
         * @param firstBitmap 第一个Bitmap，位于底部。
         * @param secondBitmap 第二个Bitmap，叠加在第一个Bitmap之上。
         * @return 合并后的Bitmap。
         */
        fun mergeBitmaps(backgroundBitmap: Bitmap, foregroundBitmap: Bitmap): Bitmap? {
            // 创建一个新的Bitmap，大小为两个Bitmap中较大的那个尺寸
            val width = backgroundBitmap.width
            val height = backgroundBitmap.height

            // 创建一个带有透明背景的新Bitmap
            val resultBitmap = Bitmap.createBitmap(width, height, backgroundBitmap.config)//Bitmap.Config.ARGB_8888
            val canvas = Canvas(resultBitmap)

            // 将第一个Bitmap绘制到canvas上
            canvas.drawBitmap(backgroundBitmap, 0f, 0f, null)
            // 将第二个Bitmap绘制到canvas上，叠加在第一个Bitmap之上
            canvas.drawBitmap(foregroundBitmap, 0f, 0f, null)

            return resultBitmap
        }

    }
}